home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Design
/
WB Collection.iso
/
workbench werkzeuge
/
bildschirmschoner
/
blitzblank_2.60
/
developer
/
programmierer.dok
< prev
next >
Wrap
Text File
|
1996-04-07
|
29KB
|
760 lines
Anleitung zum Programmieren von Modulen für BlitzBlank 2.50
===========================================================
0. Vorwort
1. Anforderungen an Module
2. Einleitung
3. Aufbau der GUI
4. Beschreibung der GUI-Objekte
5. Kommunikation mit BlitzBlank/BlitzBlankPrefs
6. Erklärung der Flags
7. Beschreibung der BlitzBlank-Strukturen und Flags
8. Beschreibung der globalen Definitionen eines Moduls (Beispiel)
9. Genaue Beschreibung des Hauptprogramms (Beispiel)
10. Genaue Beschreibung von blank()
11. Hinweise zur Unterstützung der locale.library
12. AmigaGuide-Anleitung für die Module
13. Tips & Tricks
0. Vorwort
----------
Da ich nicht alles selbst programmieren kann, habe ich versucht, das
Programmieren von Modulen so einfach, wie möglich zu machen. Ich bitte
allerdings die potentiellen Modulprogrammierer darum, mir mitzuteilen, wenn
sie an einem Modul anfangen, damit nicht 2 Leute das gleiche programmieren.
Desweiteren bekommen sie von mir ja auch die Nummern der Locale-Strings
zugeteilt. Wenn ein Modul fertig ist, dann möchte ich nicht, daß der
Programmierer es auf eigene Faust veröffentlicht, sondern es mir schickt.
Ich baue dann seine gewünschten Texte in BlitzBlank.catalog ein und seine
Anleitung in BlitzBlank.guide, um es dann zusammen mit BlitzBlank
oder als Update für die letzte BlitzBlank-Version zu releasen.
Da BlitzBlank selbst keine Shareware ist, können auch die Module
keine Shareware sein. Sie können höchstens zu Card- oder Giftware
deklariert werden.
Was ein Modul-Autor in seinen Info-Requester schreibt (zB Adresse etc.)
bleibt ihm selbst überlassen, sollte aber etwa die Form meiner Module
haben.
Ich hätte (mindestens ;-) ) noch gerne folgende Module:
- Flying irgendwas (Toaster etc)
- irgendwas mit 3D-Grafik
- Maze (Labyrinth)
- Starfield
- ASwarm
- Fraktale
- sonstige Gags
Viel Spaß,
Thomas Börkel
1. Anforderungen an Module
--------------------------
- OS 2.x/3.x kompatibel
- Minimal-OS: V2.04
- keine Abschaltung des Multitaskings
- AGA-kompatibel
- kompatibel zu Grafikkarten, wenn möglich
- möglichst Auflösungs- und Farbanzahlunabhängig
- Einhaltung der beschriebenen Richtlinien
- zum Doublebuffering nur EINEN Screen verwenden, aber mehrere BitMaps
- möglichst keinen eigenen Screen öffnen, sondern einen von BB geben lassen
- Benutzung der blitzblank.library
- wenn das Modul Grafikdaten, oder ähnliches braucht, dann sollte es diese
von Platte nachladen (mittels Read() oder der iff.library), sodass das
Modul selbst möglichst klein bleibt (beim Konfigurieren zB braucht man
nämlich diese Grafikdaten nicht)
2. Einleitung
-------------
Module für BlitzBlank sind relativ leicht zu programmieren, da BlitzBlank
vieles für die Module zur Verfügung stellt. Somit kann sich der
Modul-Programmierer auf das eigentliche Modul konzentrieren.
BlitzBlank/BlitzBlankPrefs verwalten die GUI, die Konfigdaten und den
Screen für das Modul.
Modulnamen beginnen mit "BB." und haben keinen weiteren "." im Namen.
Datenfiles für die Module (wenn es welche braucht) müssen das Format
"BB.Modulname.*" haben.
BlitzBlank-Module sind zunächst einmal normale CLI-Programme, die von
BlitzBlank oder BlitzBlankPrefs gestartet und im BLANK-Fall mit CTRL-C
beendet werden.
Ein Modul besteht mindestens aus 2 Funktionen:
- Hauptroutine (entscheidet den Programmablauf anhand des 1. Arguments)
- blank()-Routine (die eigentliche Blank-Routine)
Die Module kommunizieren mittels der blitzblank.library mit BlitzBlank
und BlitzBlankPrefs. Die Befehle der Library fangen alle mit "BBL_"
an.
Die Module bekommen beim Start bis zu 3 Kommandozeilen-Parameter:
- Aktionsschlüsselwort (BLANK|CONFIG|INFO)
- Name der Ports, mit dem das Modul kommunizieren soll
- Adresse der BlitzBlank Screeninfo-Struktur
Das Schlüsselwort legt fest, was das Modul zu tun hat. Beispiel einer
Abfrage dafür in C:
if (strcmp (argv[1],"BLANK")==0)
{
StrToLong (argv[3],(long *) &screeninfo);
BBL_SendMessage (&message,argv[2]);
if (screeninfo->bbscreen)
blank ();
BBL_ModuleDone ();
}
else
if (strcmp (argv[1],"CONFIG")==0)
{
BBL_SendMessage (&message,argv[2]);
}
else
{
message.first=NULL;
BBL_SendMessage (&message,argv[2]);
}
Das erste Argument wird auf BLANK|CONFIG|INFO überprüft und entsprechend
folgendermaßen verfahren:
BLANK:
Argument 3 wird mit der OS-Routine StrToLong() in eine Zahl verwandelt und
einem Zeiger auf eine BB_Screeninfo-Struktur zugewiesen. Dann wird
BBL_SendMessage (&message,argv[2]) aufgerufen. Anschließend wird die
blank()-Funktion aufgerufen, die die eigentlichen Modul-Routinen enthält.
Falls ein Screen angefordert wurde, muß vor diesem Aufruf noch überprüft
werden, ob screeninfo->bbscreen nicht NULL ist (könnte durch Speichermangel
passieren). Direkt vor der Hauptschleife in der blank()-Funktion wird
auf CTRL-C abgefragt und dann BBL_ModuleRunning() aufgerufen.
Nach dem Blanken muss auf JEDEN Fall BBL_ModuleDone() aufgerufen werden.
CONFIG:
Argument 3 kann mit der OS-Routine StrToLong() in eine Zahl verwandelt und
einem Zeiger auf eine BB_Screeninfo-Struktur zugewiesen werden.
BBL_SendMessage (&message,argv[2]) wird aufgerufen.
Wenn ein Modul BBF_Screenmode setzt und BBF_Colors nicht und im
Screeninfo die depth setzt, dann zeigt der Screenmoderequester in BBPrefs
auch nur die Modes an, die über mindestens diese Tiefe verfügen.
INFO:
Der Zeiger auf das erste GUI-Objekt wird auf NULL gesetzt. Dann wird
BBL_SendMessage (&message,argv[2]) aufgerufen.
3. Aufbau der GUI
-----------------
Die grafische Oberfläche eines BB-Moduls wird durch GUI-Objekte
beschrieben. Das Verwalten der Oberfläche und das Speichern und Laden der
Konfiguration übernimmt BlitzBlank bzw BlitzBlankPrefs. Das Modul braucht
sich darum nicht zu kümmern. GUI-Objekte beschreiben also einerseits
den Aufbau der GUI und sind andererseits auch gleich der Speicher
für die Parameter (Konfiguration des Moduls).
An GUI-Objekten gibt es Checkmark, Stringgadget, Filegadget, Slider,
Cycle-Gadget, VGroup und PGroup.
Die GUI-Objekte werden in VGroups und evt. in PGroups zusammengefaßt. Eine
VGroup startet durch ein GUI-Objekt des Typs BB_VGroup und endet durch
BB_VGroup_End. VGroups können nochmal zu PGroups zusammengefaßt werden.
Eine Modul-GUI enthält mindestens eine VGroup. VGroups und PGroups dürfen
sich NICHT(!) in Gruppen des jeweils gleichen Typs befinden.
Die GUI-Objekte (BB_Object) sind eine einfach verkettete, NULL-terminierte
Liste. Da zur Zeit alle GUI-Objekte gleich groß sind, kann man zu diesem
Zweck einfach ein Array vom Typ BB_Object anlegen und die Array-Elemente
entsprechend verketten (Feld <next> zeigt auf das nächste Objekt oder NULL
beim letzten).
Die einzelnen Felder der Objekte (zB <set>, <contents>...) müssen vom
Modul vorbelegt werden mit Standardeinstellungen, bevor die Message
abgeschickt wird. Wenn im BLANK-Fall die Message zurückkommt, kann
das Modul aus den GUI-Objekten die tatsächlich gewählten Parameter
auslesen.
Eine VGroup ist eine vertikale Gruppe von Gadgets. Die Gadgets werden in
der GUI untereinander dargestellt. Wenn eine Modul-GUI mehrere VGroups
besitzt, dann werden die vertikalen Gruppen nebeneinander dargestellt.
Eine PGroup enthält mehrere VGroups. Diese können mit einem Cycle-Gadget
oder einem Register-Gadget (je nachdem, wie MUI eingestellt ist),
umgeschaltet werden.
Eine Oberfläche könnte beispielsweise so aufgebaut sein:
BB_VGroup->BB_Slider->BB_Slider->BB_VGroup_End->BB_VGroup->BB_Check->
BB_Check->BB_VGroup_End
Diese GUI hätte 2 Spalten. In der linken Spalte wären 2 Slider, in der
rechten Spalte 2 Checkmarks. Mehr Beispiele findet man bei den beigelegten
Modul-Sourcecodes.
4. Beschreibung der GUI-Objekte
-------------------------------
Man kann bei den Labels der GUI-Objekte einen Unterstrich "_" vor einen
Buchstaben stellen, um diesen zur Taste für die Tastatursteuerung zu
machen. Allerdings dürfen die Buchstaben A, C, I, P, S, T nicht benutzt
werden, da diese für die unteren Buttons benötigt werden. Die Labels
werden im Sourcecode in englisch definiert.
Es folgt die Beschreibung der möglichen GUI-Objekte. Namen in <> sind
Konstanten oder Felder in BB_Object.
Pagegroup:
Start durch <BB_PGroup>, Ende durch <BB_PGroup_End>.
In <set> steht die voreingestellte Page-Nummer, <label> zeigt auf ein
NULL-terminiertes Stringsarray mit den Überschriften für die Pages.
Verticalgroup:
Start durch <BB_VGroup>, Ende durch <BB_VGroup_End>.
Falls <label> nicht NULL ist, muß <label> auf einen String zeigen. In
diesem Fall hat die VGroup eine Überschrift und einen Rahmen.
Checkmark-Gadget:
Erkennung durch <BB_Check>.
<set> kennzeichnet den Status, <label> zeigt auf den Labeltext.
Stringgadget:
Erkennung durch <BB_String>.
<max> ist die maximale Anzahl Zeichen, die das Stringgadget zulassen soll,
<contents> zeigt auf einen String-Buffer dafür, den DAS MODUL allokieren
muß, <label> zeigt auf den Labeltext.
Filegadget:
Erkennung durch <BB_File>.
<max> ist die maximale Anzahl Zeichen, die das Stringgadget zulassen soll,
<contents> zeigt auf einen String-Buffer dafür, den DAS MODUL allokieren
muß, <label> zeigt auf den Labeltext. Neben dem Stringgadget ist
ein Popbutton für einen Filerequester.
Directorygadget:
Erkennung durch <BB_Dir>.
Entspricht BB_File, erlaubt aber nur Selektion von Directories.
Fontgadget:
Erkennung durch <BB_Font>.
<max> ist die maximale Anzahl Zeichen, die das Stringgadget zulassen soll,
<contents> zeigt auf einen String-Buffer dafür, den DAS MODUL allokieren
muß, <label> zeigt auf den Labeltext. Neben dem Stringgadget ist
ein Popbutton für einen Fontrequester.
Slider:
Erkennung durch <BB_Slider>.
<min> und <max> sind die Grenzen des Sliders, <set> der voreingestellte
Wert, <label> zeigt auf den Labeltext.
Cyclegadget:
Erkennung durch <BB_Cycle>.
<set> kennzeichnet die angewählte Option, <contents> zeigt auf ein
NULL-terminiertes Stringarray mit den Optionen, <label> zeigt auf den
Labeltext.
Dummyobjekt:
Erkennung durch <BB_Dummy>.
Dieses Objekt wird als einziges verwendet, wenn das Modul keinerlei
Einstellungsmöglichkeiten durch GUI-Objekte anbieten will.
5. Kommunikation mit BlitzBlank/BlitzBlankPrefs
-----------------------------------------------
Wenn das Modul gestartet wird, erhält es auch
einen Zeiger auf die BlitzBlank-Screeninfo-Struktur. Hier kann das Modul
abweichende Screenparameter festlegen. ZB könnte ein Modul <width> auf 100
setzen. Dadurch bekäme es einen 100 Pixel breiteren Screen, als der
Benutzer eingestellt hat. In der Screeninfo-Struktur kann das Modul <xpos>,
<ypos>, <width> und <height> vorbelegen. Dieser Werte addiert BlitzBlank
dann zu den vom Benutzer ausgewählten Werten. Im NORMALfall wird ein Modul
nichts in diese Struktur hineinschreiben müssen, es sei denn, es will
zB einen Screen von BlitzBlank haben, aber die Tiefe immer selbst
festlegen (BBF_Colors wäre dann nicht gesetzt). In dem Fall würde
das Modul VOR dem Aufruf von BBL_SendMessage() die Tiefe nach
screeninfo->depth schreiben. Außerdem kann das Modul in <mindepth>
und <maxdepth> die Tiefe des Screens eingrenzen, wenn es will. BlitzBlank,
sowie der Screenmode-Requester von BBPrefs halten sich dann an diese
Grenzen.
Das Modul sendet durch BBL_SendMessage() dann eine Message an
BlitzBlank/BlitzBlankPrefs, nachdem es die Flags in <flags>, den Infotext
in <infotext> und (wenn Schlüsselwort!=INFO) in <first> den Zeiger auf das
erste GUI-Objekt gesetzt hat.
Die GUI-Objekte müssen mit den voreingestellten Parametern gefüllt sein.
Wenn die Funktion zurückkommt, sind die Felder <modpri> und <path>
gefüllt. <modpri> ist die eingestellte Modul-Taskpriorität (wird später in
blank() gesetzt) und <path> ist der Pfad zu den Modulen, falls ein Modul
noch eigene Daten nachladen will findet es diese dort (Namensmuster für
extra Moduldaten: "BB.Modulname.*"). Auch ist nach BBL_SendMessage()
die Screeninfo-Struktur ausgefüllt und ein Screen ist für das Modul
bereitgestellt worden (außer, es wollte keinen). Die GUI-Objekte sind
dann mit den vom Benutzer eingestellten Werten gefüllt und können
ausgelesen werden.
Folgendes passiert dann alles in blank():
Das Modul sollte sodann sämtliche Vorberechnungen ausführen, evt. Daten
nachladen, evt. Speicher allokieren etc. Dann bringt es seinen Screen
mit ScreenToFront (screeninfo->bbscreen) in den Vordergrund, prüft
ob mittlerweile ein CTRL-C ankam und ruft dann BBL_ModuleRunning() auf.
Schließlich kann die Hauptaktion des Modules starten. Hier werden
die eingestellten Parameter aus den GUI-Objekten ausgelesen. Das Modul muß
auf einen Abbruch durch CTRL-C reagieren können. In diesem Fall gibt das
Modul alles wieder frei (außer dem Screen, wenn es kein eigener war) und
ruft dann BBL_ModuleDone() auf. Damit ist das Modul dann beendet.
Falls das Modul von BlitzBlank keinen Screen bekommt, obwohl es einen
möchte (screeninfo->bbscreen==NULL), oder aus Speicherplatzmangel
keine Variablen anlegen kann, dann sollte das Modul sofort BBL_ModuleDone()
aufrufen und sich danach beenden.
6. Erklärung der Flags
----------------------
BBF_Screenmode : Das Modul erlaubt Screenmode-Auswahl
BBF_Colors : Das Modul erlaubt Farbanzahl-Auswahl
BBF_Sample : Noch nicht implementiert
BBF_NoWatch : Das Modul verbraucht keine(!) CPU-Zeit
BBF_NoScreen : Das Modul will von BlitzBlank keinen Screen
BBF_FirstScreen : Das Modul will die Daten der vordersten Screens
BBF_CloneScreen : Das Modul will eine Kopie des vordersten Screens
BBF_AmigaOnly : Das Modul ist NICHT kompatibel mit Grafikkarten
BBF_NoMouseBlank : Das Modul will nicht, daß die Maus geblankt wird
BBF_NoKeyPass : Das Modul benutzt keinen Screen und aktiviert auch kein Window
BBF_BigWindow : Das Blankwindow füllt den ganzen Screen aus
BBF_Interleaved : BlitzBlank vesucht, einen Screen mit Interleaved BitMap zu öffnen
Wenn ein Modul einen eigenen Screen will, (wie zB BB.Pyro), dann wird es die
Flags BBF_Screenmode und BBF_Colors setzen.
Wenn ein Modul am vordersten Screen DIREKT manipuliert (wie zB BB.Fade),
wird es das Flag BBF_FirstScreen setzen. Diese Art von Modulen ist mit
großer Vorsicht zu genießen.
Wenn ein Modul Effekte auf einer exakten Kopie des vordersten Screens
ausführt (wie zB BB.Melt), dann wird es das Flag BBF_CloneScreen setzen.
Wenn BBF_NoMouseBlank NICHT gesetzt ist, öffnet BlitzBlank ein Window
auf dem jeweiligen Screen, setzt darauf einen leeren Mauszeiger
(SetPointer()) und aktiviert dieses.
Hinweise:
---------
Wenn ein Modul seinen Screen selbst öffnen und verwalten will
(BBF_NoScreen), sollte es die Funktionen BBL_BlankMouse() und
BBL_UnBlankMouse zum Mausblanken auf diesem Screen benutzen.
Zum Schließen des Screens sollte es BBL_CloseScreenSafe () benutzen.
Der Screen sollte mit dem Tag "SA_Behind,TRUE" geöffnet werden und
erst kurz vor BBL_ModuleRunning() mit ScreenToFront() in den
Vordergrund gebracht werden.
Außerdem sollte es mit
VideoControlTags(screen->ViewPort.ColorMap,VTAG_BORDERBLANK_SET,-1,TAG_DONE);
den Border seines Screens auf schwarz schalten.
Desweiteren MUSS das Modul seinen selbst geöffneten Screen in
screeninfo->bbscreen eintragen!
Module, die eine Kopie des vordersten Screens anfordern (BBF_CloneScreen),
können einen Screen mit mehr Planes, als der Originalscreen anfordern,
wenn sie in screeninfo->depth die Differenz eintragen.
7. Beschreibung der BlitzBlank-Strukturen und Flags
---------------------------------------------------
#ifndef BLITZBLANK_H
#define BLITZBLANK_H
#include <exec/ports.h>
#include <exec/tasks.h>
/****************************************/
/* $VER: BlitzBlank.h 2.50 (01.03.95) */
/****************************************/
/********************************/
/* Stuff for blitzblank.library */
/********************************/
#define BLITZBLANKLIB_VER 6
extern struct BitMap *BBL_AllocBitMap (ULONG width,ULONG height,ULONG depth,ULONG flags);
extern struct BitMap *BBL_AllocDBufBitMap (struct Screen *screen);
extern struct RastPort *BBL_AllocRastPort (ULONG width,ULONG height,ULONG depth,ULONG flags);
extern void BBL_BlankDone (void);
extern struct Window *BBL_BlankMouse (struct Screen *screen,UBYTE mode);
extern void BBL_CloseScreenSafe (struct Screen *screen);
extern BOOL BBL_CopyOriginalColors (struct Screen *screen);
extern BOOL BBL_CopyOriginalScreen (struct Screen *screen);
extern void BBL_EndDBuf (ULONG handle);
extern BOOL BBL_FadeDown (struct Screen *screen,UBYTE final,UBYTE delay);
extern void BBL_FreeBitMap (struct BitMap *bitmap);
extern void BBL_FreeRastPort (struct RastPort *rastport);
extern long BBL_GetDarkestPen (struct Screen *screen);
extern char* BBL_GetString (UWORD num,char *text);
extern ULONG BBL_InitDBuf (struct Screen *screen,struct BitMap *bitmap);
extern void BBL_ModuleRunning (void);
extern BOOL BBL_ScreenAvailable (struct Screen *screen);
extern BOOL BBL_SendMessage (struct BB_Message *bbmessage,char *portname);
extern void BBL_ShowBitMap (struct Screen *screen,struct BitMap *bitmap,ULONG handle);
extern void BBL_UnBlankMouse (struct Window *window);
/*******************************************************************/
/* The different kinds of GUI-objects for a module's config-window */
/*******************************************************************/
#define BB_PGroup 1 /* Indicates the start of a new page group */
#define BB_PGroup_End 2 /* Indicates the end of the page group */
#define BB_VGroup 3 /* Indicates the start of a new vertical group */
#define BB_VGroup_End 4 /* Indicates the end of the vertical group */
#define BB_Check 5 /* Checkmark, uses set field in BB_Object */
#define BB_String 6 /* Textgadget, uses max/contents fields in BB_Object */
#define BB_File 7 /* Stringgadget with attached filerequester */
#define BB_Slider 8 /* Slidergadget, uses min/max/set fields in BB_Object */
#define BB_Cycle 9 /* Cyclegadget, uses set/contents in BB_Object */
#define BB_Dummy 10 /* Dummy, if you want no gadgets at all */
#define BB_Font 11 /* Stringgadget with attached fontrequester */
#define BB_Dir 12 /* Stringgadget with attached filerequester, Dirs only */
/*****************************************/
/* Flags used in BB_Message's flag-field */
/*****************************************/
#define BBF_Screenmode (1L << 0) /* Allows screenmode-selection */
#define BBF_Colors (1L << 1) /* Allows screendepth-selection */
#define BBF_Sample (1L << 2) /* Not supported yet */
#define BBF_NoWatch (1L << 3) /* Eats no CPU-time, so needs no checking */
#define BBF_NoScreen (1L << 4) /* Wants no screen from BlitzBlank */
#define BBF_FirstScreen (1L << 5) /* Wants pointer to screen in front, be CAREFUL with this! */
#define BBF_CloneScreen (1L << 6) /* Wants a clone from the FrontScreen */
#define BBF_AmigaOnly (1L << 7) /* Not supported yet */
#define BBF_NoMouseBlank (1L << 8) /* No mouseblanking from BlitzBlank wanted */
#define BBF_NoKeyPass (1L << 9) /* No keypassing necessary (no mouseblanking, no own active window */
#define BBF_BigWindow (1L << 10) /* The blankwindow fills the whole screen */
#define BBF_Interleaved (1L << 11) /* BlitzBlank TRIES to give you a screen with an Interleaved BitMap */
/*****************************************/
/* The structure, that holds config-data */
/*****************************************/
struct BB_Object
{
struct BB_Object* next; /* Pointer to next object or NULL if last object */
WORD type; /* What kind of GUI-object this is */
long min; /* Minimum value for BB_Slider */
long max; /* Maximum value for BB_Slider, max length of BB_String */
long set; /* Value of BB_Slider, state of BB_Checkmark, BB_Cycle */
char *contents; /* Pointer to buffer for BB_String, pointer to stringarray for BB_Cycle */
char *label; /* Label for ALL objects */
};
/*****************************************************/
/* The message to send to BlitzBlank/BlitzBlankPrefs */
/*****************************************************/
struct BB_Message
{
struct Message msg; /* Normal Exec-Message-structure */
long flags; /* Flags for this module */
char *infotext; /* Pointer to infotext for this module */
struct BB_Object *first; /* Pointer to first BB_Object or NULL for Info-action */
WORD modpri; /* not of use, if you use the library */
char *path; /* Path to directory for module-data */
struct Task *blitzblank; /* not of use, if you use the library */
};
/***************************************/
/* The BlitzBlank-Screeninfo-structure */
/***************************************/
struct BB_Screeninfo
{
WORD xpos; /* should be 0 */
WORD ypos; /* should be 0 */
WORD width; /* User-selected screen-width */
WORD height; /* User-selected screen-height */
WORD depth; /* User-selected screen-depth */
long mode; /* User-selected screen-mode */
struct Screen *bbscreen; /* module screen */
struct Window *bbwindow; /* blank window */
WORD mindepth; /* desired minimum depth or 0 */
WORD maxdepth; /* desired maximum depth or 0 */
};
/************************************************************/
/* Flag-definition for BBL_AllocBitMap()/BBL_AllocRastPort, */
/* if you don't have the V39-includes */
/************************************************************/
#ifndef BMB_CLEAR
#define BMB_CLEAR 0
#define BMB_DISPLAYABLE 1
#define BMB_INTERLEAVED 2
#define BMF_CLEAR (1l<<BMB_CLEAR)
#define BMF_DISPLAYABLE (1l<<BMB_DISPLAYABLE)
#define BMF_INTERLEAVED (1l<<BMB_INTERLEAVED)
#endif
#endif
8. Beschreibung der globalen Definitionen eines Moduls (Beispiel)
-----------------------------------------------------------------
/* Einbindung der BlitzBlank-Definitionen */
#include <pragmas/blitzblank_pragmas.h>
#include <BlitzBlank.h>
/* Definition der BlitzBlankBase */
struct Library *BlitzBlankBase;
/* Versionstring */
static const char version[]="$VER: BB.Melt 2.50 (26.12.94)";
/* Definition der Texte (in englisch) */
char *text[]={"\33c\33uMelt\33n\n\nModule for BlitzBlank\n\nCopyright1994\nby\nThomas Börkel",
"_Speed:",
"S_ize:"};
/* Definition der GUI-Objekte mit den Voreinstellungsparametern */
struct BB_Object object[]={ {&object[1],BB_VGroup ,0, 0, 0,NULL,NULL},
{&object[2],BB_Slider ,1,150,100,NULL,NULL},
{&object[3],BB_Slider ,1,100, 30,NULL,NULL},
{NULL ,BB_VGroup_End,0, 0, 0,NULL,NULL} };
/* Definiton der BB_Message */
struct BB_Message message;
/* Definition des Zeigers auf BB_Screeninfo */
struct BB_Screeninfo *screeninfo;
9. Genaue Beschreibung des Hauptprogramms (Beispiel)
----------------------------------------------------
Das Hauptprogramm sollte folgendermaßen aussehen (Beispiel in C):
void main (int argc,char **argv)
{
int i;
/* Öffnen der blitzblank.library */
if (!(BlitzBlankBase=OpenLibrary ("blitzblank.library",BLITZBLANKLIB_VER)))
exit (0);
/* Flags setzen */
message.flags=BBF_CloneScreen;
message.first=&object[0];
/* BLANK/CONFIG/INFO? */
if (strcmp (argv[1],"BLANK")==0)
{
/* screeninfo holen */
StrToLong (argv[3],(long *) &screeninfo);
/* Message und GUI-Objekte ausfüllen lassen */
BBL_SendMessage (&message,argv[2]);
/* Screen offen? */
if (screeninfo->bbscreen)
/* Blanken */
blank ();
/* Blankroutine beendet */
BBL_BlankDone ();
}
else
{
/* Locale-Texte holen (200=Zahl, die vom BB-Autor zugewiesen wird) */
message.infotext=BBL_GetString (200,text[0]);
for (i=1;i<=5;i++)
object[i].label=BBL_GetString (200+i,text[i]);
if (strcmp (argv[1],"CONFIG")==0)
{
BBL_SendMessage (&message,argv[2]);
}
else
{
message.first=NULL;
BBL_SendMessage (&message,argv[2]);
}
}
/* Library schließen */
CloseLibrary (BlitzBlankBase);
exit (0);
}
10. Genaue Beschreibung von blank()
-----------------------------------
void blank (void)
{
/* Vorbereitungen treffen (Speicher allokieren etc) */
/* Wenn das Modul seinen Screen selbst öffnete, muß es ihn jetzt in */
/* screeninfo->bbscreen eintragen */
if (!CheckSignal (SIGBREAKF_CTRL_C))
{
/* Screen nach vorne holen */
ScreenToFront (screeninfo->bbscreen);
BBL_ModuleRunning (); /* Screen muß hier bereits vorne sein */
/* Hauptschleife mit Abbruchmöglichkeit durch SIGBREAKF_CTRL_C */
/* Eingestellte Parameter aus den GUI-Objekten auslesen */
}
/* Aufräumen */
return;
}
11. Hinweise zur Unterstützung der locale.library
-------------------------------------------------
BlitzBlank/BlitzBlankPrefs verwenden EINEN Catalog "blitzblank.catalog".
Hier drin stehen die lokalisierten Strings für BlitzBlank, BlitzBlankPrefs
und alle Module. Welche Strings zu dem jeweiligen Modulen gehören, legt der
BlitzBlank-Autor fest. Die Modul-Programmierer sollten in ihren Programmen
die englischen Texte einbauen und die passenden deutschen dazu dem Autor
mitteilen. Dieser baut die Texte dann in den Catalog ein.
Zur Zeit sind folgende Nummern für Texte vergeben:
001-199: BlitzBlank/BlitzBlankPrefs
200-209: BB.Melt
210-219: BB.Fade
220-229: BB.Pyro
230-239: BB.Crumble
240-249: BB.Mosaic
250-259: BB.Aquarium
260-269: BB.Flash
270-279: BB.Lines
280-289: BB.Butterfly
290-299: BB.Slideshow
300-309: BB.Starfield
310-319: BB.Splines
320-329: BB.AmigaSign
330-339: BB.PatternCycling
340-349: BB.Execute
350-359: BB.Worms
360-379: BB.Tiles
380-399: BB.Clock
400-409: BB.Mandel
410-419: BB.Electric
420-429: BB.Fountain
430-439: BB.Guru
440-449: BB.Noise
450-459: BB.Radar
460-469: BB.Snow
470-479: BB.Worms2
480-499: BB.Spot
500-509: BB.Life
510-519: BB.Dissolve
520-539: BB.Tunnel
540-549: BB.Gravity
550-559: BB.Skyline
560-589: BB.Text
590-599: BB.FlyingToaster
600-629: BB.Plasma
630-639: BB.TicTacToe
640-649: BB.Maze
650-659: BB.ARose
660-669: BB.Fractal
670-699: Reserved
700-709: BB.Goats
710-729: BB.ASwarm
12. AmigaGuide-Anleitung für die Module
---------------------------------------
Die Anleitung für die Module wird in das globale AmigaGuide-Dokument
BlitzBlank.Guide mit eingebunden und wird dann beim Druck auf die
HELP-Taste im jeweiligen Prefs-Window eines Moduls für dieses Modul von
BlitzBlankPrefs angezeigt. Die Modul-Anleitung mit Copyright-Hinweis
und Anschrift des Autors sollte dem BlitzBlank-Autor möglichst in
englisch und deutsch gegeben werden, damit sie in das Guide einkopiert
werden kann.
13. Tips & Tricks
-----------------
- Wenn BlitzBlank von der Shell aus gestartet wird, erscheinen auch alle
CON-Ausgaben der Module in dieser Shell (nützlich zu Debug-Zwecken). Wird
BlitzBlank von der WB aus gestartet und das Modul macht CON-Ausgaben,
dann wirft das Modul Enforcer-Hits. Das ist normal, da die Module
beim WB-Start keinen Ausgabe-Kanal bekommen. Die Module dürfen
nur zu Debug-Zwecken CON-Ausgaben machen.
- Der ARexx-Befehl DEBUG erlaubt es, ein Modul zu starten, das dann NUR
durch den ARexx-Befehl UNBLANK oder das Beenden von BlitzBlank
gestoppt wird. Man kann also in Ruhe das Modul austesten etc.
- Am besten wird die Vorgehensweise verständlich, wenn man sich die
mitgelieferten Source-Codes anschaut.
- Module, die externe Daten brauchen, müssen diese so benennen:
"BB.Modulname.xyz".
- In der blitzblank.library befinden sich nicht nur die unbedingt
notwendigen Funktionen, sondern auch ein paar nützliche (zB auch
für Double-Buffering!).
- Man sollte bei Modulen, die Zufallsfunktionen gebrauchen, nicht
vergessen, den Seed zu setzen (zB mit der aktuellen Uhrzeit, siehe
zB BB.Lines).
- Normalerweise zeichnet man in &screeninfo->bbscreen->RastPort, was recht
schnell ist. Allerdings hat man dann kein Clipping. Um Clipping zu
benutzen, setzt man das Flag BBF_BigWindow und zeichnet dann in
screeninfo->bbwindow->RPort.